Skip to main content

Kubernetes 常用指令

kubectl 基本指令

run 建立 Pod

kubectl run po $POD_NAME --image=$IMAGE_NAME --restart=Never --dry-run=client
  • --dry-run 參數常用來生成建立 POD 的 YAML 檔案(證照考試常用)

apply 透過文件創建物件

kubectl apply -f $FILE.YAML

delete 删除物件

kubectl delete pod $POD_NAME

get 查看物件

kubectl get pod --namespace=$NS_NAME
  • 只查看特定 namespace 中的 pod
kubectl get pods -o wide
  • 查看 pod 的所有細節
kubectl get all -A
  • 查看所有 namespace 的 pod
kubectl get deployment $DP_NAME
kubectl get pod $POD_NAME -o yaml

#取得建立 POD 時的 YAML 檔案

kubectl get pod $POD_NAME -v 6
  • 獲取每一個 kubectl 命令在 API level 的 log,使用 6,7,8,9 不同的 level,數值越大得到的信息詳細
kubectl get pods $POD_NAME --watch -v 6
  • #持續監聽 lubectl 在 API level 的操作
kubectl get events
  • 查看創建 pod 中發生的 issue

create 創建物件

kubectl create deployment $DP_NAME --image=$IMAGE_NAME --replicas 3
  • 創建一個 deployment
kubectl create job $JOB_NAME --image=$IMAGE_NAME -- sh -c "sleep 50"
  • 創建一個 job
kubectl create cronjob $CRONJOB_NAME --image=$IMAGE_NAME --schedule="*/1 * * * *" -- echo "Hello World”
#創建一個 cronjob
kubectl create ns $NS_NAME
#創建 namespace

describe 詳細描述物件資訊

kubectl describe nodes $NODE_NAME
# 查看 Node
kubectl describe pods $POD_NAME

delete 刪除物件

kubectl delete pod $POD_NAME
kubectl delete service $SERVICE_NAME
kubectl delete deployments.apps web
kubectl delete persistentvolumeclaims $PVC_NAME
kubectl delete persistentvolume $PV_NAME
#清理 service 與 Volume
kubectl delete pod <name> --grace-period=$SECOND
#在時間內刪除 pod
kubectl delete pod <name> --grace-period**=0** --force
#強制刪除 pod (SIGKILL)

log 查看日誌 log

kubectl logs $POD_NAME
kubectl logs $POD_NAME -c $CONTAINER_NAME
kubectl logs $POD_NAME --all-containers
kubectl logs --selector $KEY1**=**$VALUE1
kubectl logs -f $POD_NAME
follow latest logs
kubectl logs -f $POD_NAME $CONTAINER_NAME
若 Pod 內有兩個以上的 container,要在指令後方加上 container name,否則會發生 error
kubectl logs $POD_NAME --tail **5**   *# get last 5 entries logs

exec 在 pod 中執行指令

kubectl exec $POD_NAME -- ls /
#Run command in existing pod (1 container case)
kubectl exec --stdin --tty $POD_NAME -- /bin/sh
#Interactive shell access to a running pod (1 container case)
kubectl exec $POD_NAME -c my-container -- ls /
#Run command in existing pod multi-container case

annotate 在 pod 中建立 annotation****

kubectl annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]`

debug 建立 debug 模式

kubectl debug (POD | TYPE[[.VERSION].GROUP]/NAME) [ -- COMMAND [args...] ]`

set 更新 image

kubectl set image deployment/web nginx**=**nginx:1.14.2`

rollout 更新回滾

kubectl rollout undo deployment $DP_NAME --to-revision=1
kubectl rollout history deployment $DP_NAME
查看 rollout history
kubectl rollout history deployment $DP_NAME --revision**=1**`
查看 revision history

scale 擴展 Deployment

kubectl scale deployment $DP_NAME --replicas **5**`

taint 限制某些 node 不能建立 pod

kubectl taint nodes $NODE_NAME $KEY1**=**$VALUE1:NoSchedule   
# to add
kubectl taint nodes $NODE_NAME $KEY1**=**$VALUE1:NoSchedule-  
# to delete
kubectl taint nodes $NODE_NAME $KEY1**=**$VALUE1:NoSchedule
kubectl create deployment $DP_NAME --image=$IMAGE_NAME --replicas=3
create a deployment with replica =3 (no pod will be scheduled on k8s-worker1)

label 為資源加上 label

kubectl label nodes $NODE_NAME hardware**=**local_gpu`

cordon 標記 node 讓其不能建立 pod

kubectl cordon $NODE_NAME`
#把一个节点标记为 unschedulabel, 一旦标记后,就不会有新的 pod 被部署到这个节点上了`

drain 非強制的刪除节点上的 Pod

kubectl drain $NODE_NAME --ingore-daemonsets`

top 查看資源使用效率 CPU Memory

kubectl top pods
kubectl top nodes

auth 確認權限

kubectl auth can-i <verb> <resoureces>
kubectl auth can-i create nodes
kubectl auth can-i delete pods
kubectl auth can-i delete nodes --as dev-user`

config

kubectl config view 
#Show Merged kubeconfig settings
kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'
#get the password for the e2e user
kubectl config view -o jsonpath='{.users[*].name}'
#get a list of users
kubectl config get-contexts
#display list of contexts
kubectl config current-context
#display the current-context
kubectl config use-context my-cluster-name
#set the default context to my-cluster-name
kubectl cluster-info
kubectl config view
apiVersion: v1
clusters:

- cluster:
certificate-authority-data: DATA+OMITTED
server: [https://172.31.9.108:6443](https://172.31.9.108:6443/)
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
```bash
kubectl config view --raw
apiVersion: v1
clusters:

- cluster:
certificate-authority-data:
server: [https://172.31.9.108:6443](https://172.31.9.108:6443/)
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data:
client-key-data:

```bash
kubectl config get-contexts

Patch 更新物件

kubectl patch node $NODE_NAME -p '{"spec":{"unschedulable":true}}'`
#Partially update a node
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'`
#Update a container's image; spec.containers[*].name is required because it's a merge key
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'`
#Update a container's image using a json patch with positional arrays
kubectl patch deployment valid-deployment  --type json   -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'`
#Disable a deployment livenessProbe using a json patch with positional arrays
kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'`
#Add a new element to a positional array
kubectl patch deployment nginx-deployment --subresource='scale' --type='merge' -p '{"spec":{"replicas":2}}'`
#Update a deployment's replica count by patching its scale subresource

kubeadm 基本指令

init 初始化一个 Kubernetes 控制平面节点

kubeadm init

join 初始化 Kubernetes 工作节点并将其加入集群

kubeadm join --discovery-token abcdef.1234567890abcdef 1.2.3.4:6443

upgrade 支持升级的规划和实际执行

kubeadm upgrade plan [version] [flags]
#检查可升级到哪些版本,并验证你当前的集群是否可升级
kubeadm upgrade apply [version]
#将 Kubernetes 集群升级到指定版本

config 列出默认静态配置

kubeadm config print

reset 还原由 init 或 join 所做的更改

kubeadm reset [flags]

token 在 server 上創造 token

kubeadm token create [token]

Version 输出 kubeadm 的版本

kubeadm version

特殊使用情境

檢視服務紀錄檔

systemctl status kubelet
systemctl status kube-controller-manager -l
journalctl -u kube-controller-manager
journalctl -u kubelet`